package fr.generali.accueilclient.gwt.showcase.client;

import java.util.HashSet;
import java.util.Set;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;

import fr.generali.accueilclient.gwt.client.ui.common.message.Message;
import fr.generali.accueilclient.gwt.client.ui.components.block.Block;
import fr.generali.accueilclient.gwt.client.ui.components.errorpanel.ErrorPanel;
import fr.generali.accueilclient.gwt.client.ui.components.form.button.ButtonBar;
import fr.generali.accueilclient.gwt.client.ui.components.popup.ChoicePopupBox;
import fr.generali.accueilclient.gwt.client.ui.components.popup.PopupBox;
import fr.generali.accueilclient.gwt.client.ui.components.section.Section;
import fr.generali.accueilclient.gwt.client.ui.components.tooltip.Tooltip;
import fr.generali.accueilclient.gwt.showcase.client.form.FormDemo;
import fr.generali.accueilclient.gwt.showcase.client.form.Formulaire;
import fr.generali.accueilclient.gwt.showcase.client.form.Formulaire2;
import fr.generali.accueilclient.gwt.showcase.client.form.FormulaireLeger;
import fr.generali.accueilclient.gwt.showcase.client.form.ListBoxDemo;
import fr.generali.accueilclient.gwt.showcase.client.form.TableExemple;
import fr.generali.accueilclient.gwt.showcase.client.formfield.FormFieldDemo;

public class Display extends Composite {

    private static DemonstrateurUiBinder uiBinder = GWT.create(DemonstrateurUiBinder.class);

    interface DemonstrateurUiBinder extends UiBinder<Widget, Display> {
    }

    @UiField
    Hyperlink blocMenu;

    @UiField
    Hyperlink sectionMenu;

    @UiField
    Hyperlink errorBlockMenu;

    @UiField
    Hyperlink formFieldMenu;

    @UiField
    Hyperlink tooltipMenu;

    @UiField
    Hyperlink listboxMenu;

    @UiField
    Hyperlink formWithErrorMenu;

    @UiField
    Hyperlink form1Link;

    @UiField
    Hyperlink form2Link;

    @UiField
    Hyperlink formLightLink;

    @UiField
    Hyperlink tableLink;

    @UiField
    SimplePanel content;

    @UiField
    Block block;

    @UiField
    Section section;

    @UiField
    ErrorPanel errorPanel;

    @UiField
    FormFieldDemo formField;

    @UiField
    Tooltip tooltip;

    @UiField
    ListBoxDemo listBoxDemo;

    @UiField
    FormDemo formWithError;

    @UiField
    Formulaire formulaire1;

    @UiField
    Formulaire2 formulaire2;

    @UiField
    FormulaireLeger formulaireLeger;

    @UiField
    TableExemple tableExemple;

    public Display() {
        initWidget(uiBinder.createAndBindUi(this));

        Set<Message> someStubedErrorMessages = getSomeStubedErrorMessages();

        errorPanel.setMessages(someStubedErrorMessages);
    }

    @UiHandler("blocMenu")
    void handleBlockMenuClick(ClickEvent event) {
        content.setWidget(block);
    }

    @UiHandler("sectionMenu")
    void handleSectionMenuClick(ClickEvent event) {
        content.setWidget(section);
    }

    @UiHandler("errorBlockMenu")
    void handleErrorBlockMenuClick(ClickEvent event) {
        content.setWidget(errorPanel);
    }

    @UiHandler("formFieldMenu")
    void handleFormFieldMenuClick(ClickEvent event) {
        content.setWidget(formField);
    }

    @UiHandler("tooltipMenu")
    void handleTooltipMenuClick(ClickEvent event) {
        content.setWidget(tooltip);
    }

    @UiHandler("listboxMenu")
    void handleListBoxMenuClick(ClickEvent event) {
        content.setWidget(listBoxDemo);
    }

    @UiHandler("form1Link")
    void handleForm1LinkClick(ClickEvent event) {
        content.setWidget(formulaire1);
    }

    @UiHandler("form2Link")
    void handleForm2LinkClick(ClickEvent event) {
        content.setWidget(formulaire2);
    }

    @UiHandler("formLightLink")
    void handleFormulaireLegerLinkClick(ClickEvent event) {
        content.setWidget(formulaireLeger);
        formulaireLeger.validate();
    }

    @UiHandler("tableLink")
    void handleTablerLinkClick(ClickEvent event) {
        content.setWidget(tableExemple);
    }

    private Set<Message> getSomeStubedErrorMessages() {
        Set<Message> errorMessages = new HashSet<Message>();

        errorMessages.add(new Message("La mise en forme n'est pas correcte"));

        Message anErrorMessage = new Message("Veuillez renseigner le nom");
        anErrorMessage.addCause("Une première cause");
        anErrorMessage.addCause("Une autre cause");
        anErrorMessage.addCause("La dernière cause");

        errorMessages.add(anErrorMessage);

        errorMessages.add(new Message("Vous n'avez pas les droits"));

        Message anotherErrorMessage = new Message("Le système n'est pas disponible");
        anotherErrorMessage.addCause("La cause");
        errorMessages.add(anotherErrorMessage);

        return errorMessages;
    }

    @UiField
    Hyperlink buttonsLink;

    @UiField
    Hyperlink popupLink;

    @UiField
    Hyperlink choicePopupLink;

    @UiHandler("buttonsLink")
    void handleButtonsLinkClick(ClickEvent event) {

        ButtonBar bar = new ButtonBar();

        content.setWidget(bar);

    }

    //
    @UiHandler("popupLink")
    void handlePopupLinkClick(ClickEvent event) {

        final ChoicePopupBox p = new ChoicePopupBox("Enregistrer la modification", "Annuler");
        p.setText("Modification de l'email numéro 1");
        p.setWidget(formulaire2);
        p.setGlassEnabled(true);

        p.addCloseHandler(new CloseHandler<PopupPanel>() {
            @Override
            public void onClose(CloseEvent<PopupPanel> event) {
                Window.alert("Popup Fermée !");

            }
        });

        p.setActionCommand(new Command() {

            @Override
            public void execute() {
                Window.alert("Vous avez appuyé sur 'Valider'");
                p.hide();

            }
        });

        p.setCancelCommand(new Command() {

            @Override
            public void execute() {
                Window.alert("Vous avez appuyé sur 'Annuler'");
                p.hide();

            }
        });

        p.center();
    }

    @UiHandler("choicePopupLink")
    void handleChoicePopupLinkClick(ClickEvent event) {
        PopupBox box = new PopupBox();
        box.setText("Modification de l'email numéro 1");
        box.setWidget(errorPanel);
        box.setGlassEnabled(true);
        box.center();
    }
}
